﻿/**
 * @file passwordlineedit.h
 * @author huangxb
 * @email 18228033207@163.com
 * @date 2024.04.13
 * @license MIT License
 * @brief 自定义密码输入框.
 *
 * @htmlonly
 * <span style="font-weight: bold">History</span>
 * @endhtmlonly
 * Version|Auther|Date|Describe
 * ------|----|------|--------
 * V1.0|huangxb|2024.04.13|创建
 */
#ifndef PASSWORDLINEEDIT_H
#define PASSWORDLINEEDIT_H

/* 库头文件 */
#include <QWidget>
/* 前置声明 */
namespace Ui {
class CPasswordLineEdit;
}

/** @brief 自定义密码输入框. */
class CPasswordLineEdit : public QWidget
{
    Q_OBJECT

private:
    /** @brief 非明文显示时，显示的字符，字符的unicode值 */
    enum EPasswordChar
    {
        EPC_CIRCLE = 0x25CF, /**< 实心圆 */
        EPC_STAR = 0x002a, /**< 星号（*） */
    };

    /** @brief 控件样式参数 */
    struct StyleParam
    {
        QString strInputVisibleImage; /**< 文本明文显示时按钮的图片 */
        QString strInputInvisibleImage; /**< 文本非明文显示时按钮的图片 */
        QColor  clrBackground; /**< 控件整体背景色，默认白色 */
        QColor  clrBorder; /**< 输入框边框颜色 */
        QColor  clrInputText; /**< 输入框文本颜色 */
        QFont   fontInputText; /**< 输入框文本的字体 */
        EPasswordChar nPasswordChar = EPC_CIRCLE; /**< 文本非明文显示时使用的字符 */
        QString strInputStateIconImage; /**< 当输入文本正确时，末尾显示的图标，默认不显示 */
    };

    StyleParam m_styleParam; /**< 样式参数信息 */

    Ui::CPasswordLineEdit *ui; /**< 布局文件 */

public:
    /**
     * @brief 构造函数.
     * @param[in] parent 父窗口
     */
    explicit CPasswordLineEdit(QWidget *parent = nullptr);
    ~CPasswordLineEdit();

    /**
     * @brief 设置自定义样式参数.
     * @param[in] styleParam 样式参数
     */
    void SetStyleParam(const StyleParam& styleParam);

    /**
     *  @brief 获取当前的自定义样式参数.
     *  @return 样式参数
     */
    const StyleParam& GetStyleParam() const;

    /**
     * @brief 获取默认的样式参数.
     * @return 默认样式参数
     */
    StyleParam GetDefaultStyleParam() const;

    /**
     * @brief 是否显示输入状态的图标.
     * @param[in] bShow 是否显示
     */
    void ShowInputStateIcon(bool bShow);

    /** @see QLineEdit#setMaxLength */
    void setMaxLength(int nLen);

    /** @see QLineEdit#setText */
    void setText(const QString &arg);

    /** @see QLineEdit#text */
    QString text() const;

signals:
    /** @see QLineEdit#textChanged */
    void textChanged(const QString &arg);

    /** @see QLineEdit#returnPressed */
    void returnPressed();

    /** @see QLineEdit#editingFinished */
    void editingFinished();

private slots:
    /** @see QPushButton#clicked */
    void on_m_inputVisible_pushButton_clicked();

private:
    /**
     *  @brief 初始化默认样式参数.
     *  @param[in] styleParam 样式参数
     */
    void InitDefaultStyleParam(StyleParam& styleParam) const;

    /**
     * @brief 通过样式参数获取stylesheet.
     * @param styleParam 样式参数
     * @return stylesheet字符串
     */
    QString GetStyleSheetByStyleParam(const StyleParam& styleParam) const;
};

#endif // PASSWORDLINEEDIT_H
